﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity.Validation;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace Sisco.AccesoDatos
{
    public class EquipoDAO
    {
        SiscoEntities conexion;

        public List<EQUIPO> Listar()
        {
            List<EQUIPO> lista = new List<EQUIPO>();

            using (conexion = new SiscoEntities())
            {
                lista = 
                    conexion.EQUIPO.Include("TIPOEQUIPO1").
                                    //Include("RELACION_EQUI_PROG").
                                    //Include("USUARIO").
                                    //Include("MOVIMIENTO").
                                    Where(x => x.ELIMINADO == 0).ToList();
            }

            return lista;            
        }

        public int Registrar(EQUIPO nuevoEquipo, MOVIMIENTO nuevoMovimiento)
        {
            using (conexion = new SiscoEntities())
            {
                int resultado;

                try
                {
                    using (TransactionScope ts = new TransactionScope())
                    {
                        conexion.EQUIPO.Add(nuevoEquipo);
                        conexion.SaveChanges();

                        nuevoMovimiento.IDEQUIPO = nuevoEquipo.ID;
                        conexion.MOVIMIENTO.Add(nuevoMovimiento);
                        resultado = conexion.SaveChanges();

                        ts.Complete();
                    }
                }
                catch (DbEntityValidationException dbEx)
                {
                    foreach (var validationErrors in dbEx.EntityValidationErrors)
                    {
                        foreach (var validationError in validationErrors.ValidationErrors)
                        {
                            Trace.TraceInformation("Propiedad: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
                        }
                    }

                    resultado = 0;
                }
                catch (Exception)
                {
                    resultado = 0;
                }

                return resultado;
            }
        }

        public int AsignarEquipo(int idUsuario, EQUIPO equipo, EQUIPO_ESTADO equipoEstado, MOVIMIENTO nuevoMovimiento,USUARIO usuarioSistema)
        {
            using (conexion = new SiscoEntities())
            {
                int resultado;

                try
                {
                    using (TransactionScope ts = new TransactionScope())
                    {
                        conexion.EQUIPO.Attach(equipo);
                        equipo.IDUSUARIO = idUsuario;
                        equipo.IDESTADO = equipoEstado.ID;
                        equipo.FECHAMODIFICACION = DateTime.Now;
                        equipo.MODIFICADOPOR = usuarioSistema.NOMBRECOMPLETO != null ? usuarioSistema.NOMBRECOMPLETO.Trim() : string.Empty;

                        nuevoMovimiento.IDEQUIPO = equipo.ID;
                        conexion.MOVIMIENTO.Add(nuevoMovimiento);
                        resultado = conexion.SaveChanges();

                        ts.Complete();
                    }
                }
                catch (DbEntityValidationException dbEx)
                {
                    foreach (var validationErrors in dbEx.EntityValidationErrors)
                    {
                        foreach (var validationError in validationErrors.ValidationErrors)
                        {
                            Trace.TraceInformation("Propiedad: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
                        }
                    }

                    resultado = 0;
                }

                return resultado;
            }
        }

        public object BuscarEquipo(string valMarca, string valModelo, string valSerie, int? valIdTipoEquipo, DateTime? valFechaRegistroDesde, DateTime? valFechaRegistroHasta, int? valEstado)
        {
            using (conexion = new SiscoEntities())
            {
                return conexion.usp_listar_Equipos(valMarca, valModelo, valSerie, valIdTipoEquipo, valFechaRegistroDesde, valFechaRegistroHasta, valEstado).ToList();
            }
        }

        public System.Data.DataTable USP_ListarEquipo(string marca, string modelo, string serie, int? tipoEquipo, int? estadoEquipo)
        {
            DataTable result = new DataTable();

            result.Columns.Add("Id", Type.GetType("System.String"));
            result.Columns.Add("TipoEquipo", Type.GetType("System.String"));
            result.Columns.Add("Marca", Type.GetType("System.String"));
            result.Columns.Add("Modelo", Type.GetType("System.String"));
            result.Columns.Add("Serie", Type.GetType("System.String"));
            result.Columns.Add("Estado", Type.GetType("System.String"));
            result.Columns.Add("Usuario", Type.GetType("System.String"));

            using (conexion = new SiscoEntities())
            {
                var query = conexion.usp_ListarEquipo_Rep(tipoEquipo, marca, modelo, serie, estadoEquipo);
                DataRow dr;

                foreach (var c in query)
                {
                    dr = result.NewRow();

                    dr[0] = c.Id.ToString();
                    dr[1] = c.TipoEquipo != null ? c.TipoEquipo.Trim() : string.Empty;
                    dr[2] = c.Marca != null ? c.Marca.Trim() : string.Empty;
                    dr[3] = c.Modelo != null ? c.Modelo.Trim() : string.Empty;
                    dr[4] = c.Serie != null ? c.Serie.Trim() : string.Empty;
                    dr[5] = c.Estado != null ? c.Estado.Trim() : string.Empty;
                    dr[6] = c.Usuario != null ? c.Usuario.Trim() : string.Empty;

                    result.Rows.Add(dr);
                }

                return result;
            }
        }

        public int Modificar(EQUIPO selectedEquipo, EQUIPO updEquipo)
        {
            using (conexion = new SiscoEntities())
            {
                conexion.EQUIPO.Attach(selectedEquipo);
                selectedEquipo.IDTIPOEQUIPO = updEquipo.IDTIPOEQUIPO;
                selectedEquipo.TIPOEQUIPO = updEquipo.TIPOEQUIPO;
                selectedEquipo.MARCA = updEquipo.MARCA;
                selectedEquipo.MODELO = updEquipo.MODELO;
                selectedEquipo.SERIE = updEquipo.SERIE;
                selectedEquipo.FECHAMODIFICACION = updEquipo.FECHAMODIFICACION;
                selectedEquipo.MODIFICADOPOR = updEquipo.MODIFICADOPOR;
                return conexion.SaveChanges();
            }
        }

        public int Liberar(EQUIPO selectedEquipo, EQUIPO updEquipo, MOVIMIENTO nuevoMovimiento, USUARIO usuarioSistema)
        {
            using (conexion = new SiscoEntities())
            {
                int resultado;

                try
                {
                    using (TransactionScope ts = new TransactionScope())
                    {
                        conexion.EQUIPO.Attach(selectedEquipo);
                        selectedEquipo.IDESTADO = updEquipo.IDESTADO;
                        selectedEquipo.FECHAMODIFICACION = DateTime.Now;
                        selectedEquipo.MODIFICADOPOR = usuarioSistema.NOMBRECOMPLETO != null ? usuarioSistema.NOMBRECOMPLETO.Trim() : string.Empty;
                        selectedEquipo.IDUSUARIO = new Nullable<int>();

                        nuevoMovimiento.IDEQUIPO = selectedEquipo.ID;
                        conexion.MOVIMIENTO.Add(nuevoMovimiento);
                        resultado = conexion.SaveChanges();

                        ts.Complete();
                    }
                }
                catch (DbEntityValidationException dbEx)
                {
                    foreach (var validationErrors in dbEx.EntityValidationErrors)
                    {
                        foreach (var validationError in validationErrors.ValidationErrors)
                        {
                            Trace.TraceInformation("Propiedad: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
                        }
                    }

                    resultado = 0;
                }
                //catch (Exception)
                //{
                //    resultado = 0;
                //}

                return resultado;
            }
        }

        public int DarBajaEquipo(EQUIPO selectedEquipo, EQUIPO updEquipo, MOVIMIENTO nuevoMovimiento, USUARIO usuarioSistema)
        {
            using (conexion = new SiscoEntities())
            {
                int resultado;

                try
                {
                    using (TransactionScope ts = new TransactionScope())
                    {
                        conexion.EQUIPO.Attach(selectedEquipo);
                        selectedEquipo.IDESTADO = updEquipo.IDESTADO;
                        selectedEquipo.FECHAMODIFICACION = DateTime.Now;
                        selectedEquipo.MODIFICADOPOR = usuarioSistema.NOMBRECOMPLETO != null ? usuarioSistema.NOMBRECOMPLETO.Trim() : string.Empty;
                        selectedEquipo.IDUSUARIO = new Nullable<int>();

                        nuevoMovimiento.IDEQUIPO = selectedEquipo.ID;
                        conexion.MOVIMIENTO.Add(nuevoMovimiento);
                        resultado = conexion.SaveChanges();

                        ts.Complete();
                    }
                }
                catch (DbEntityValidationException dbEx)
                {
                    foreach (var validationErrors in dbEx.EntityValidationErrors)
                    {
                        foreach (var validationError in validationErrors.ValidationErrors)
                        {
                            Trace.TraceInformation("Propiedad: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
                        }
                    }

                    resultado = 0;
                }

                return resultado;
            }
        }
    }
}
